(function (angular) {
  'use strict';
  angular.module('FileManagerApp').factory('item', ['fileManagerConfig', 'chmod', function (fileManagerConfig, Chmod) {
    
    var Item = function (model, path) {
      var rawModel = {
        name: model && model.name || '',
        path: path || [],
        type: model && model.type || 'file',
        size: model && parseInt(model.size || 0),
        date: parseMySQLDate(model && model.date),
        perms: new Chmod(model && model.rights),
        content: model && model.content || '',
        recursive: false,
        fullPath: function () {
          var path = this.path.filter(Boolean);
          return ('/' + path.join('/') + '/' + this.name).replace(/\/\//, '/');
        }
      };
      
      this.error = '';
      this.processing = false;
      
      this.model = angular.copy(rawModel);
      this.tempModel = angular.copy(rawModel);
      
      function parseMySQLDate(mysqlDate) {
        var d = (mysqlDate || '').toString().split(/[- :]/);
        return new Date(d[0], d[1] - 1, d[2], d[3], d[4], d[5]);
      }
    };
    
    Item.prototype.update = function () {
      angular.extend(this.model, angular.copy(this.tempModel));
    };
    
    Item.prototype.revert = function () {
      angular.extend(this.tempModel, angular.copy(this.model));
      this.error = '';
    };
    
    Item.prototype.isFolder = function () {
      return this.model.type === 'dir';
    };
    
    Item.prototype.isEditable = function () {
      return !this.isFolder() && fileManagerConfig.isEditableFilePattern.test(this.model.name);
    };
    
    Item.prototype.isImage = function () {
      return fileManagerConfig.isImageFilePattern.test(this.model.name);
    };
    
    Item.prototype.isCompressible = function () {
      return this.isFolder();
    };
    
    Item.prototype.isExtractable = function () {
      return !this.isFolder() && fileManagerConfig.isExtractableFilePattern.test(this.model.name);
    };
    
    Item.prototype.isSelectable = function () {
      return (this.isFolder() && fileManagerConfig.allowedActions.pickFolders) || (!this.isFolder() && fileManagerConfig.allowedActions.pickFiles);
    };
    
    return Item;
  }]);
})(angular);
